<?php

/**
* @File name: datamysqli.php
* @author: 李枨煊[Email:lcx165@gmail.com]
* @Date: Wed Aug 22 12:00:47 CST 2007
* @Desription: MySQL操作类[mysqli]
*/
class DataMysql{
	private $modeType = MYSQL_ASSOC;
	private $host;
	private $user;
	private $pass;
	private $database;
	private $debug;
	private $link = null;
	/**
	 * 构造方法
	 *
	 * @return Data_DbMysql
	 */
	public function __construct($host, $user, $pass, $database, $debug=true)
	{
		$this->host = $host;
		$this->user = $user;
		$this->pass = $pass;
		$this->database = $database;
		$this->debug = $debug;
		$this->getLink();	//取得数据库连接
	}

	/**
	 * 析构
	 *
	 */
	function __destruct()
	{
		$this->disConnect();
	}

	/**
	 * 取得mysql数据库连接句柄
	 *
	 * @return int mysql连接句柄
	 */
	public function getLink()
	{
		if ($this->link != null)
		{
			return $this->link;
		}
		else
		{
			$this->link = mysqli_connect($this->host, $this->user, $this->pass,$this->database);
			$this->query("SET NAMES utf8");	//设置编码
			return $this->link;
		}
	}
	/**
	 * 查询数据库
	 *
	 * @param string $sql
	 */
	public function query($sql)
	{
		$result = @mysqli_query($this->link,$sql);
		//报错
		if($result === false && $this->debug === true)
		{
			echo  "<b>ERROR_NUMBER</b> : ".mysqli_errno($this->getLink()) . "<br /><b>ERROR_INFO</b> : " . mysqli_error($this->getLink()) . '<br /><b>ERROR_SQL</b> : ' . $sql . '<br /><br /><br />';
			return false;
		}
		return $result;
	}

	/**
	 * 关闭数据库
	 *
	 * @return int
	 */
	public function disConnect(){
		$ret = @mysqli_close($this->getLink());
		$this->link = null;
		return $ret;
	}

	/**
     * 设置查询结果返回数据类型
     *
     * @param int $modeType 设置查询结果返回设置,1为关联索引和数字所有都有,2为使用关联索引,3为使用数字索引
     */
	public function setFetchMode($modeType)
	{
		switch ($modeType){
			case 1:    //数字索引和关联索引都有
			$this->modeType = MYSQL_BOTH;
			break;
			case 2:    //使用关联索引
			$this->modeType = MYSQL_ASSOC;
			break;
			case 3: //使用数字索引
			$this->modeType = MYSQL_NUM;
			break;
			default://缺省使用关联索引
			$this->modeType = MYSQL_ASSOC;
		}
	}

	/**
     * 取得结果集
     *
     * @param string $sql	SQL语句
     * @return array		查询结果（二维数组）
     */
	public function getRows($sql)
	{
		$record = array();
		$result = $this->query($sql);

		while ($row = mysqli_fetch_array($result,$this->modeType))
		{
			$record[] = $row;
		}
		@mysqli_free_result($result);
		return $record;
	}

	/**
     * 执行sql返回该语句影响的行数,如update,delete
     *
     * @param string $sql
     * @return int 
     */
	public function execute($sql)
	{
		$this->query($sql);
		$count = mysqli_affected_rows($this->link);
		return $count;
	}

	/**
     * 获取上次插入操作的的ID
     *
     * @return int 如果没有连接或者查询失败,返回0, 成功返回ID
     */
	public function getLastInsertId()
	{
		if (($last_id = mysqli_insert_id($this->link)) > 0)
		{
			return $last_id;
		}
		return $this->getOne("SELECT LAST_INSERT_ID()");
	}

	/**
     * 获取单行记录(一维数组)
     *
     * @param string $sql 需要执行查询的SQL语句
     * @return array 成功返回结果记录的一维数组,失败返回false
     */
	function getRow($sql)
	{
		$result = $this->query($sql);
		$record = array();
		$record = @mysqli_fetch_array($result, $this->modeType);
		@mysqli_free_result($result);
		if (!is_array($record) || empty($record))
		{
			return false;
		}
		return $record;
	}

	/**
     * 获取一个数据(当条数组)
     *
     * @param string $sql 需要执行查询的SQL
     * @return 成功返回获取的一个数据,失败返回false
     */
	function getOne($sql, $field='')
	{
		if (!$result = $this->query($sql))
		{
			return false;
		}
		$record = array();
		$row = @mysqli_fetch_array($result, $this->modeType);
		@mysqli_free_result($result);
		if (!is_array($row) || empty($row)){
			return false;
		}
		if (trim($field) != '')
		{
			$record = $row[$field];
		}else{
			$record = current($row);
		}
		return $record;
	}

	/**
     * 获取一列数据(一维数组)
     *
     * @param string $sql 需要获取的字符串
     * @param string $field 需要获取的列,如果不指定,默认是第一列
     * @return 成功返回提取的结果记录的一维数组,失败返回false
     */
	function getCol($sql, $field='')
	{
		echo 'asdfa';
		if (!$result = $this->query($sql))
		{
			return false;
		}
		$record = array();
		exit;
		while($row = @mysqli_fetch_array($result, $this->modeType))
		{
			if (trim($field) == '')
			{
				$record[] = current($row);
			} else {
				$record[] = $row[$field];
			}
		}
		@mysqli_free_result($result);
		if (!is_array($record) || empty($record))
		{
			return false;
		}
		return $record;
	}

	/**
     * 获取受到影响的记录数量 (用于Update/Delete/Insert操作)
     *
     * @return int 如果没有连接或者影响记录为空, 否则返回影响的行数量
     */
	function getAffectedRows()
	{
		if (!$this->link)
		{
			return 0;
		}
		return mysqli_affected_rows($this->link);
	}

	/**
     * 返回一个数据表的字段总数
     *
     * @param  $table_name
     * @return 表的字段总数
     */
	function getFieldSum($table_name)
	{
		$sql = 'SELECT * FROM '.$table_name.' limit 1';
		return mysqli_num_fields($this->query($sql));
	}

	/**
     * 返回一个表的字段名和类型的数组
     *
     * @param  $table_name	表名
     * @return 这个表的字段名数组
     */
	function getFieldNames($table_name)
	{
		$fieldNames = array();
		$sql = 'SELECT * FROM '.$table_name.' LIMIT 1';
		$rs = $this->query($sql);
		$fields = mysqli_fetch_fields($rs);

		for ($i=0; $fields[$i]; $i++)
		{
			$tempArray['field_name'] = $fields[$i]->name;
			$tempArray['field_type'] = $fields[$i]->type;
			$fieldNames[$i] = $tempArray;
		}
		return $fieldNames;
	}

}
// 创建实例
$db = new DataMysql($cfg_db['host'], $cfg_db['user'], $cfg_db['pass'], $cfg_db['database']);
?>